//C07:Stlshape2.cpp
// Stlshape.cpp with the purge() function.
#include <iostream>
#include <vector>
#include "../purge.h"
using namespace std;

class Shape
{
    public:
        virtual void draw() = 0;
        virtual ~Shape() {};
};

class Circle : public Shape
{
    public:
        void draw() { cout << "Circle::draw()" << endl; }
        ~Circle() { cout << "~Circle()" << endl; }
};

class Triangle : public Shape
{
    public:
        void draw() { cout << "Triangel::draw()" << endl; }
        ~Triangle() { cout << "~Triangle()" << endl; }
};

class Square : public Shape
{
    public:
        void draw() { cout << "Sqare::draw()" << endl; }
        ~Square() { cout << "~Square()" << endl; }
};

int main(void)
{
    typedef std::vector<Shape*> Container;
    typedef Container::iterator Iter;
    Container shapes;
    shapes.push_back(new Circle);
    shapes.push_back(new Square);
    shapes.push_back(new Triangle);

    for (Iter i = shapes.begin(); i != shapes.end(); i++)
    {
        (*i)->draw();
    }
    purge(shapes);

}